Micron Document
NexusPi Git Node


Displaying Raw • Download

DeviceUID.h f0aee0671e84b627f90883c0f1fca8f0d4dbc9da (f0aee067) Text, 5.26 KB

T8b949e// Hardware-rooted device unique ID.
T8b949e//
T8b949e// Derived at boot from factory-burned identifiers — no provisioning required:
T8b949e// ESP32: BT MAC (efuse), via esp_read_mac(mac, ESP_MAC_BT). Already a
T8b949e// public link-layer identifier, used directly.
T8b949e// nRF52: FICR DEVICEADDR, with the 0xC0 BLE static-random marker applied
T8b949e// so the value matches the address advertised over BLE.
T8b949e// NATIVE: SHA-256(salt || stable_host_identifier)[0..5]. Source is, in
T8b949e// priority order: /etc/machine-id, /var/lib/dbus/machine-id,
T8b949e// /proc/cpuinfo Serial line, then hostname. The hash hides the
T8b949e// underlying identifier — those sources are not normally
T8b949e// broadcast by the OS, so exposing them verbatim in a radio
T8b949e// announce would leak host identity. Different threat model
T8b949e// from the BLE-rooted IDs above, hence the extra step.
T8b949e//
T8b949e// 6 bytes / 48 bits — the smallest size that preserves the full unique range
T8b949e// of both sources. Independent of ADDR_SERIAL and rnodeconf provisioning.

Tff7b72#Tff7b72ifndef DEVICEUID_H
Tff7b72#Tff7b72define DEVICEUID_H

Tff7b72#Tff7b72include T8b949e<stdint.h>
Tff7b72#Tff7b72include T8b949e<stdio.h>
Tff7b72#Tff7b72include T8b949e"Boards.h"

Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Tff7b72#Tff7b72if __has_include("esp_mac.h")
Tff7b72#Tff7b72include T8b949e"esp_mac.h"
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e"esp_system.h"
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NATIVE
Tff7b72#Tff7b72include T8b949e<string.h>
Tff7b72#Tff7b72include T8b949e<unistd.h>
Tff7b72#Tff7b72include T8b949e<SHA256.h>
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72define DEVICE_UID_LEN 6
Tff7b72#Tff7b72define DEVICE_UID_STR_LEN 13 T8b949e// 12 hex chars + NUL

Tffa657uint8_t Te6edf3device_uidTb4b4b4[Te6edf3DEVICE_UID_LENTb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Tffa657char Te6edf3device_uid_strTb4b4b4[Te6edf3DEVICE_UID_STR_LENTb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;

Tff7b72#Tff7b72if MCU_VARIANT == MCU_NATIVE
T8b949e// Return number of bytes written to `out`, or 0 if the source isn't usable.
T8b949e// Helpers are file-scope static — DeviceUID.h is included from exactly one
T8b949e// translation unit (RNode_Firmware.ino) so no ODR concerns.

Tff7b72static Tffa657size_t Td2a8ffdeviceuid_read_file_trimmedTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3pathTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3outTb4b4b4, Tffa657size_t Te6edf3capTb4b4b4) Tb4b4b4{
Tffa657FILETff7b72* Te6edf3f Tff7b72= Te6edf3fopenTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fTb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Tffa657size_t Te6edf3n Tff7b72= Te6edf3freadTb4b4b4(Te6edf3outTb4b4b4, T79c0ff1Tb4b4b4, Te6edf3capTb4b4b4, Te6edf3fTb4b4b4)Tb4b4b4;
Te6edf3fcloseTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3n Tff7b72> T79c0ff0 Tff7b72&Tff7b72& Tb4b4b4(Te6edf3outTb4b4b4[Te6edf3nT79c0ff-1Tb4b4b4] Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff\nTa5d6ff' Tff7b72|Tff7b72| Te6edf3outTb4b4b4[Te6edf3nT79c0ff-1Tb4b4b4] Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff\rTa5d6ff' Tff7b72|Tff7b72|
Te6edf3outTb4b4b4[Te6edf3nT79c0ff-1Tb4b4b4] Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff Ta5d6ff' Tff7b72|Tff7b72| Te6edf3outTb4b4b4[Te6edf3nT79c0ff-1Tb4b4b4] Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff\tTa5d6ff'Tb4b4b4)Tb4b4b4) Te6edf3nTff7b72-Tff7b72-Tb4b4b4;
Tff7b72return Te6edf3nTb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657size_t Td2a8ffdeviceuid_read_cpuinfo_serialTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3outTb4b4b4, Tffa657size_t Te6edf3capTb4b4b4) Tb4b4b4{
Tffa657FILETff7b72* Te6edf3f Tff7b72= Te6edf3fopenTb4b4b4(Ta5d6ff"Ta5d6ff/proc/cpuinfoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fTb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Tffa657char Te6edf3lineTb4b4b4[T79c0ff256Tb4b4b4]Tb4b4b4;
Tffa657size_t Te6edf3result Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3fgetsTb4b4b4(Te6edf3lineTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4, Te6edf3fTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3strncmpTb4b4b4(Te6edf3lineTb4b4b4, Ta5d6ff"Ta5d6ffSerialTa5d6ff"Tb4b4b4, T79c0ff6Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tff7b72continueTb4b4b4;
Tffa657charTff7b72* Te6edf3p Tff7b72= Te6edf3strchrTb4b4b4(Te6edf3lineTb4b4b4, Ta5d6ff'Ta5d6ff:Ta5d6ff'Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3pTb4b4b4) Tff7b72continueTb4b4b4;
Te6edf3pTff7b72+Tff7b72+Tb4b4b4;
Tff7b72while Tb4b4b4(Tff7b72*Te6edf3p Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff Ta5d6ff' Tff7b72|Tff7b72| Tff7b72*Te6edf3p Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff\tTa5d6ff'Tb4b4b4) Te6edf3pTff7b72+Tff7b72+Tb4b4b4;
Tffa657size_t Te6edf3hex_len Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3pTb4b4b4[Te6edf3hex_lenTb4b4b4] Tff7b72&Tff7b72&
Tb4b4b4(Tb4b4b4(Te6edf3pTb4b4b4[Te6edf3hex_lenTb4b4b4] Tff7b72>Tff7b72= Ta5d6ff'Ta5d6ff0Ta5d6ff' Tff7b72&Tff7b72& Te6edf3pTb4b4b4[Te6edf3hex_lenTb4b4b4] Tff7b72<Tff7b72= Ta5d6ff'Ta5d6ff9Ta5d6ff'Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3pTb4b4b4[Te6edf3hex_lenTb4b4b4] Tff7b72>Tff7b72= Ta5d6ff'Ta5d6ffaTa5d6ff' Tff7b72&Tff7b72& Te6edf3pTb4b4b4[Te6edf3hex_lenTb4b4b4] Tff7b72<Tff7b72= Ta5d6ff'Ta5d6fffTa5d6ff'Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3pTb4b4b4[Te6edf3hex_lenTb4b4b4] Tff7b72>Tff7b72= Ta5d6ff'Ta5d6ffATa5d6ff' Tff7b72&Tff7b72& Te6edf3pTb4b4b4[Te6edf3hex_lenTb4b4b4] Tff7b72<Tff7b72= Ta5d6ff'Ta5d6ffFTa5d6ff'Tb4b4b4)Tb4b4b4)Tb4b4b4) Te6edf3hex_lenTff7b72+Tff7b72+Tb4b4b4;
T8b949e// Many SoC kernels emit a placeholder Serial of all zeros — treat that
T8b949e// as "no usable serial" and let the next fallback run.
Tff7b72if Tb4b4b4(Te6edf3hex_len Tff7b72< T79c0ff8Tb4b4b4) Tff7b72breakTb4b4b4;
Tffa657bool Te6edf3all_zero Tff7b72= Tffa657trueTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3hex_lenTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pTb4b4b4[Te6edf3iTb4b4b4] Tff7b72!Tff7b72= Ta5d6ff'Ta5d6ff0Ta5d6ff'Tb4b4b4) Tb4b4b4{ Te6edf3all_zero Tff7b72= Tffa657falseTb4b4b4; Tff7b72breakTb4b4b4; Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3all_zeroTb4b4b4) Tff7b72breakTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hex_len Tff7b72> Te6edf3capTb4b4b4) Te6edf3hex_len Tff7b72= Te6edf3capTb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3outTb4b4b4, Te6edf3pTb4b4b4, Te6edf3hex_lenTb4b4b4)Tb4b4b4;
Te6edf3result Tff7b72= Te6edf3hex_lenTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Te6edf3fcloseTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657size_t Td2a8ffdeviceuid_read_hostnameTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3outTb4b4b4, Tffa657size_t Te6edf3capTb4b4b4) Tb4b4b4{
Tffa657char Te6edf3hostTb4b4b4[T79c0ff256Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3gethostnameTb4b4b4(Te6edf3hostTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3hostTb4b4b4)Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Te6edf3hostTb4b4b4[Tff7b72sizeofTb4b4b4(Te6edf3hostTb4b4b4)T79c0ff-1Tb4b4b4] Tff7b72= Ta5d6ff'Ta5d6ff\0Ta5d6ff'Tb4b4b4;
Tffa657size_t Te6edf3n Tff7b72= Te6edf3strlenTb4b4b4(Te6edf3hostTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72> Te6edf3capTb4b4b4) Te6edf3n Tff7b72= Te6edf3capTb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3outTb4b4b4, Te6edf3hostTb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3nTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif T8b949e// MCU_VARIANT == MCU_NATIVE

Tffa657void Td2a8ffdevice_uid_initTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Te6edf3esp_read_macTb4b4b4(Te6edf3device_uidTb4b4b4, Te6edf3ESP_MAC_BTTb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Tffa657uint32_t Te6edf3lo Tff7b72= Te6edf3NRF_FICRTff7b72-Tff7b72>Te6edf3DEVICEADDRTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tffa657uint32_t Te6edf3hi Tff7b72= Te6edf3NRF_FICRTff7b72-Tff7b72>Te6edf3DEVICEADDRTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3device_uidTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3lo Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4;
Te6edf3device_uidTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3lo Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4;
Te6edf3device_uidTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3lo Tff7b72>Tff7b72> T79c0ff16Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4;
Te6edf3device_uidTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3lo Tff7b72>Tff7b72> T79c0ff24Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4;
Te6edf3device_uidTb4b4b4[T79c0ff4Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3hi Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4;
Te6edf3device_uidTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3hi Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4) Tff7b72| T79c0ff0xC0Tb4b4b4;

Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NATIVE
Tffa657uint8_t Te6edf3rawTb4b4b4[T79c0ff256Tb4b4b4]Tb4b4b4;
Tffa657size_t Te6edf3n Tff7b72= Te6edf3deviceuid_read_file_trimmedTb4b4b4(Ta5d6ff"Ta5d6ff/etc/machine-idTa5d6ff"Tb4b4b4, Te6edf3rawTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3n Tff7b72= Te6edf3deviceuid_read_file_trimmedTb4b4b4(Ta5d6ff"Ta5d6ff/var/lib/dbus/machine-idTa5d6ff"Tb4b4b4, Te6edf3rawTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3n Tff7b72= Te6edf3deviceuid_read_cpuinfo_serialTb4b4b4( Te6edf3rawTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3n Tff7b72= Te6edf3deviceuid_read_hostnameTb4b4b4( Te6edf3rawTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3fprintfTb4b4b4(Te6edf3stderrTb4b4b4, Ta5d6ff"Ta5d6ff[DeviceUID] no usable identifier source; UID will be 000000000000Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// SHA-256(salt || raw), take first 6 bytes. Salt is hashed including its
T8b949e// terminating NUL so a hypothetical raw input of "microReticulum-device-uid"
T8b949e// can't collide with the salted form.
Tff7b72static Tff7b72const Tffa657char Te6edf3saltTb4b4b4[Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffmicroReticulum-device-uidTa5d6ff"Tb4b4b4;
Te6edf3SHA256 Te6edf3shaTb4b4b4;
Te6edf3shaTb4b4b4.Te6edf3updateTb4b4b4(Te6edf3saltTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3saltTb4b4b4)Tb4b4b4)Tb4b4b4; T8b949e// sizeof(salt) includes the trailing '\0'
Te6edf3shaTb4b4b4.Te6edf3updateTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3digestTb4b4b4[T79c0ff32Tb4b4b4]Tb4b4b4;
Te6edf3shaTb4b4b4.Te6edf3finalizeTb4b4b4(Te6edf3digestTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3digestTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3device_uidTb4b4b4, Te6edf3digestTb4b4b4, Te6edf3DEVICE_UID_LENTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif

Te6edf3snprintfTb4b4b4(Te6edf3device_uid_strTb4b4b4, Te6edf3DEVICE_UID_STR_LENTb4b4b4,
Ta5d6ff"Ta5d6ff%02X%02X%02X%02X%02X%02XTa5d6ff"Tb4b4b4,
Te6edf3device_uidTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3device_uidTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3device_uidTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4,
Te6edf3device_uidTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3device_uidTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4, Te6edf3device_uidTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72endif T8b949e// DEVICEUID_H

Served by rngit 1.5.2 - Generated in 0.02s